package __stack

import (
	"fmt"
	"strconv"
	"strings"
)

/**
栈的数组实现
*/

const maxSize = 10

type SqStack struct {
	data [maxSize]int
	top  int // 指向栈顶的指针，起始值为 -1
}

func InitSqStack() *SqStack {
	return &SqStack{top: -1}
}

func (s *SqStack) ClearStack() {
	s.top = -1
}

func (s *SqStack) IsEmpty() bool {
	return s.top == -1
}

// GetTop 获取栈顶元素
// 成功 -> 元素值
// 失败 -> -1
func (s *SqStack) GetTop() int {
	if s.top == -1 {
		return -1
	}
	return s.data[s.top]
}

// Push 入栈
// 成功 -> 0
// 失败 -> -1
func (s *SqStack) Push(e int) int {
	if s.top == maxSize-1 {
		return -1
	}
	s.top++
	s.data[s.top] = e
	return 0
}

// Pop 出栈，并删除
// 成功 -> 元素
// 失败 -> -1
func (s *SqStack) Pop() int {
	if s.top == -1 {
		return -1
	}
	r := s.GetTop()
	s.top--
	return r
}

func (s *SqStack) StackLength() int {
	return s.top + 1
}

func (s *SqStack) String() string {
	sb := strings.Builder{}
	for i := s.top; i > 0; i-- {
		sb.WriteString(strconv.Itoa(s.data[i]))
		if i != 1 {
			sb.WriteString("->")
		}
	}
	return fmt.Sprintf("data=%s, length=%d", sb.String(), s.StackLength())
}
